package org.android.pasos.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.util.Date;

import org.android.pasos.Constants;
import org.android.pasos.DatosTrama;
import org.android.pasos.data.PasosApplication;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;

public class UtilJSON {
	// Cliente para realizar peticiones REST
	private static DefaultHttpClient client = new DefaultHttpClient();

	public static void enviarIncidencia(Context ctx, String urlRest,
			String cincidencia, DatosTrama dt) {
		SharedPreferences mPrefs = ctx.getSharedPreferences("PasosPreferences", 0);
		PasosApplication appState = ((PasosApplication) ctx.getApplicationContext());
		JSONObject jsonTipoIncidencia = new JSONObject();
		JSONObject jsonPersona = new JSONObject();
		JSONObject jsonUsuario = new JSONObject();
		JSONObject jsonIncidencia = new JSONObject();

		// RECUPERAR VALORES DESDE UN FICHERO DE PROPIEDADES!!
		try {

			jsonPersona.put("nombre", mPrefs.getString("Pnombre", ""));
			jsonPersona.put("apellido1", mPrefs.getString("Papellido1", ""));
			jsonPersona.put("apellido2", mPrefs.getString("Papellido2", ""));
			jsonPersona.put("telefono",
					new Long(mPrefs.getString("Ptelefono", "")));
			jsonPersona.put("direccion", mPrefs.getString("Pdireccion", ""));
			jsonPersona.put("localidad", mPrefs.getString("Plocalidad", ""));
			jsonPersona.put("provincia", mPrefs.getString("Pprovincia", ""));
			jsonPersona.put("codpostal",
					new Integer(mPrefs.getString("Pcodpostal", "")));
			jsonPersona.put("email", mPrefs.getString("Pemail", ""));
			jsonPersona.put("fecnacimiento",
					new Long(mPrefs.getString("Pfecnacimiento", "")));
			jsonPersona.put("id", new Integer(mPrefs.getString("Pid", "")));

			jsonUsuario.put("idPersonaFk", jsonPersona);
			jsonUsuario.put("foto", null);
			jsonUsuario.put("imei", new Long(mPrefs.getString("Uimei", "")));
			jsonUsuario.put("grupo", mPrefs.getString("Ugrupo", ""));
			jsonUsuario.put("id", new Integer(mPrefs.getString("Uid", "")));

			jsonTipoIncidencia.put("descripcion", appState.getMapIncidencias().get(cincidencia));
			jsonTipoIncidencia.put("id", cincidencia);

			jsonIncidencia.put("fecha", new Date().getTime());
			jsonIncidencia.put("idUsuarioFk", jsonUsuario);
			jsonIncidencia.put("idEmpleadoFk", null);
			jsonIncidencia.put("idTincidenciaFk", jsonTipoIncidencia);
			jsonIncidencia.put("temperatura", new Double(10.0));
			if (mPrefs.getString("Papellido1", "vacio").equals("Emu")) {
				jsonIncidencia.put("longitud", -4.42);
				jsonIncidencia.put("latitud", 36.7196);
			} else {
				jsonIncidencia.put("longitud", new Double(dt.getLn()));
				jsonIncidencia.put("latitud", new Double(dt.getLt()));
			}
			jsonIncidencia.put("altitud", new Integer(0));
			jsonIncidencia.put("numSatelites", new Integer(4));
			Log.d(Constants.LOGTAG, "pb: " + dt.getPb());
			if (dt.getPb().equals("")) {
				jsonIncidencia.put("nivelBateria", new Integer(47));
			} else {
				jsonIncidencia.put("nivelBateria", new Integer(dt.getPb()));
			}

			insertJSON(urlRest, jsonIncidencia);

			Log.d(Constants.LOGTAG, jsonIncidencia.toString());
		} catch (JSONException e) {
			Log.e(Constants.LOGTAG, "Error al dar formato a JSON");
		}
	}

	public static JSONObject obtenerDatosUsuario(String imei) {
		JSONObject jo = null;
		try {	
			BufferedReader in = new BufferedReader(new InputStreamReader(
					getJSON(Constants.URL_IMEI_REST + imei)));
			String line;
			while ((line = in.readLine()) != null) {				
				jo = new JSONObject(line);
			}
		} catch (MalformedURLException e) {
			Log.e(Constants.LOGTAG, "URL mal formada");
			e.printStackTrace();
		} catch (IOException e) {
			Log.e(Constants.LOGTAG, "IO Exception");
			e.printStackTrace();
		} catch (JSONException e) {
			Log.e(Constants.LOGTAG, "Error al parsear JSON");
			e.printStackTrace();
		}
		return jo;
	}

	public static JSONArray obtenerTipoIncidencias() {
		JSONArray ja = null;
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(
					getJSON(Constants.URL_TIPO_INCIDENCIAS_REST)));
			String line;
			while ((line = in.readLine()) != null) {
				ja = new JSONArray(line);
			}
		} catch (MalformedURLException e) {
			Log.e(Constants.LOGTAG, "URL mal formada");
			e.printStackTrace();
		} catch (IOException e) {
			Log.e(Constants.LOGTAG, "IO Exception");
			e.printStackTrace();
		} catch (JSONException e) {
			Log.e(Constants.LOGTAG, "Error al parsear JSON");
			e.printStackTrace();
		}
		return ja;
	}

	private static void insertJSON(String urlRest, JSONObject jsonIncidencia) {
		HttpPost postRequest = new HttpPost(urlRest);

		try {
			StringEntity se = new StringEntity(jsonIncidencia.toString(),
					HTTP.UTF_8);

			se.setContentType("application/json");
			postRequest.setHeader("Content-Type",
					"application/json;charset=UTF-8");
			postRequest.setEntity(se);
			HttpResponse getResponse = client.execute(postRequest);
			final int statusCode = getResponse.getStatusLine().getStatusCode();
			if (statusCode != HttpStatus.SC_NO_CONTENT) {
				Log.w(Constants.LOGTAG, "Error " + statusCode + " for URL "
						+ urlRest);
			}
		} catch (IOException e) {
			postRequest.abort();
			Log.w(Constants.LOGTAG, "Error for URL " + urlRest, e);
		}
	}

	public static InputStream getJSON(String url) {
		HttpGet getRequest = new HttpGet(url);
		try {
			HttpResponse getResponse = client.execute(getRequest);
			final int statusCode = getResponse.getStatusLine().getStatusCode();
			if (statusCode != HttpStatus.SC_OK) {
				Log.w(Constants.LOGTAG, "Error " + statusCode + " for URL "
						+ url);
				return null;
			}
			HttpEntity getResponseEntity = getResponse.getEntity();
			return getResponseEntity.getContent();
		} catch (IOException e) {
			getRequest.abort();
			Log.w(Constants.LOGTAG, "Error for URL " + url, e);
		}
		return null;
	}
}
